import { createI18n } from 'vue-i18n';
import cookie from '@/utils/cookie';
import langMap from '@/config/lang';

const locales = langMap.map(item => ({
    ...item,
    data: {},
}));

const files = import.meta.globEager('../locales/**/*.js');
const keys = Object.keys(files).map(it => it.replace(/(^\.\/)|(\.js$)/g, ''));
keys.forEach(key => {
    let arr = key.split('/');
    const { data } = locales.find(it => it.name === arr[0]) || {};
    if (data) {
        const file = files[`./${key}.js`].default;
        arr = arr.slice(1, arr.length);
        arr.reduce((obj, item, index) => {
            if (!obj[item] && item !== 'index') {
                obj[item] = {
                    ...obj[item],
                };
            }

            if (index === arr.length - 1) {
                if (item === 'index') {
                    Object.keys(file).forEach(it => {
                        obj[it] = file[it];
                    });

                    return obj;
                }

                obj[item] = file;
            }

            return obj[item];
        }, data);
    }
});

/**
 * 当前所有语言列表
 *
 * @type {Array}
 */
const langs = locales.map(item => item.name);

/**
 * 国际化语言包
 *
 * @inner
 * @type {Object}
 */
const messages = {};
locales.forEach((item) => {
    messages[item.name] = {
        ...item.data,
    };
});

const LANG = cookie.get('lang') || 'zh-cn';

const i18n = createI18n({
    legacy: false,
    locale: LANG,
    messages,
    warnHtmlMessage: false,
});

/**
 * 获取浏览器支持语言.
 *
 * @return {string|undefined}
 */
const getBrowserLanguage = () => {
    let language;
    let lang;

    if (navigator.appName === 'Netscape') {
        /* eslint-disable-next-line */
        language = navigator.language;
    } else {
        language = navigator.browserLanguage;
    }

    langMap.some((item) => {
        if (language.indexOf(item.browserName) > -1) {
            lang = item.name;
            return true;
        }
        return false;
    });

    return lang;
};

/**
 * 判断语言是否支持.
 *
 * @param  {any} lang - 语言.
 * @return {boolean}
 */
const isSupportLang = lang => lang && langs.indexOf(lang) > -1;

/**
 * 替换链接中的语言标识
 *
 * @description
 * 1. 会自动替换错误的 //
 * 2. 根据当前的语言，自动处理前缀
 * 3. 如果为单语言，将自动删除 lang 前缀
 *
 * @param  {string} path - 路径链接.
 * @param  {string} [lang = i18n.global.locale.value] - 追加语言，默认为当前语言
 * @return {string}
 *
 * @example
 *  1. 默认追加当前语言
 *      replacePath('/login') => /zh-cn/login
 *
 *  2. 替换当前语言
 *      replacePath('/ko-kr/login') => /zh-cn/login
 *
 *  3. 替换参数语言
 *      replacePath('/ko-kr/login', 'zh') => /zh/login
 *  4. 自动修改链接中的 /
 *      replacePath('//zh-cn///login') => /zh-cn/login
*/
const replacePath = (path = '', lang = i18n.global.locale.value) => {
    const paths = path.replace(/^\/+/, '').split(/\/+/);

    // 如果一级是语言，则删除
    if (isSupportLang(paths[0])) {
        paths.splice(0, 1);
    }

    // 处理多语言前缀
    return langs.length > 1 ? `/${lang}/${paths.join('/')}` : `/${paths.join('/')}`;
};

/**
 * 查找修正的语言
 *
 * @param {string} lang 目标语言
 * @return {(string|null)} 修正之后的语言
 */
const findLang = (lang = '') => {
    let result = null;

    langs.some((item) => {
        // 如果目标完全一致
        if (item === lang) {
            result = lang;
            return true;
        // 如果大小写有问题，则修正
        } else if (item.toUpperCase() === lang.toUpperCase()) {
            result = item;
            return true;
        }
        return false;
    });

    return result;
};

export {
    i18n,
    isSupportLang,
    getBrowserLanguage,
    replacePath,
    langs,
    findLang,
};
